package com.fadada.api;


import com.fasc.open.api.bean.base.BaseRes;
import com.fasc.open.api.bean.common.UserIdentInfo;
import com.fasc.open.api.bean.common.UserInfoExtend;
import com.fasc.open.api.bean.req.user.*;
import com.fasc.open.api.bean.res.common.EUrlRes;
import com.fasc.open.api.bean.res.user.*;
import com.fasc.open.api.client.UserClient;
import com.fasc.open.api.enums.common.AuthScopeEnum;
import com.fasc.open.api.exception.ApiException;
import com.fasc.open.api.utils.ResultUtil;

import java.util.Arrays;

/**
 * @author FDD
 * @version 0.0.1
 * @ClassName UserDemo.java
 * @Description 用户帐号管理接口demo
 * @Param
 * @createTime 2021年10月22日 15:36:00
 */
public class UserDemo extends BaseDemo{

    private static UserClient userClient;

    public static void main(String[] args) {
        try{
            BaseDemo baseDemo = new BaseDemo();
            openApiClient = baseDemo.getClient();
            userClient = new UserClient(openApiClient);
            //获取应用accessToken
            accessToken = baseDemo.getAccessToken(openApiClient);
            //添加用户
            userAdd();
            //修改用户
            userUpdate();
            //删除用户
            userDelete();
            //禁用个人用户
            userDisable();
            //恢复个人用户
            userEnable();
            //获取个人用户授权链接
            userGetAuthUrl();
            //获取用户实名信息
            getIdentityInfo();
            //查询个人用户基本信息
            userGet();
        }catch (ApiException e){
            e.printStackTrace();
        }
    }

    /**
     * 添加个人用户
     *
     * **接口说明：**把应用系统上将要使用法大大平台服务的个人用户添加到法大大平台。法大大平台会为这些用户分配在该appId范围内的唯一标识openUserId。后续，针对该用户进行的授权请求、签署任务等调用都将使用该openUserId标识该用户。您可在应该管理后台查看和管理已经添加的用户。
     *
     * **适用场景：**应用系统上的个人用户需要使用法大大电子签服务时，可通过该接口将其添加到法大大平台，为后续请求授权、参与签署任务做好准备。这是应用系统上的任何个人用户要使用法大大电子签服务前，应用系统要做的第一步调用。
     *
     * **注意：**应用系统应该将返回的openUserId存储在自己的数据库中，并和设定的clientUserId建立一一对应关系，以便于后续的其他接口调用使用该参数。
     */
    public static void userAdd() throws ApiException{
        AddUserReq addUserReq = new AddUserReq();
        addUserReq.setAccessToken(accessToken);
        //用户在应用系统中的唯一标识，具体取值的选择和编码格式取决于应用系统和开发者。要求在一个appId范围内具有唯一性。
        addUserReq.setClientUserId("用户id");
        //个人用户别名，便于在使用和管理时的可辨识性，建议使用姓名、邮箱等可辨识度高的字符串。最大长度50个字符。
        addUserReq.setClientUserName("用户别名");
        BaseRes<AddOpenUserRes> res = userClient.add(addUserReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 更新用户信息
     *
     * **接口说明：**为已添加的个人用户修改在应用系统中的关联参数。
     *
     * **适用场景：**个人用户在应用系统的标识(clientUserId)或其他信息产生了变化，需要更新关联关系和参数时调用。
     */
    public static void userUpdate() throws ApiException{
        UpdateUserReq updateUserReq = new UpdateUserReq();
        updateUserReq.setAccessToken(accessToken);
        //法大大平台为该用户在该应用appId范围内分配的唯一标识。
        updateUserReq.setOpenUserId(openUserId);
        //用户在应用系统中的唯一标识。
        updateUserReq.setClientUserId("接入方系统内个人用户id");
        //个人用户别名，便于在使用和管理时的可辨识性，建议使用姓名、邮箱等可辨识度高的字符串。最大长度50个字符。
        updateUserReq.setClientUserName("个人用户名称");
        BaseRes<Void> res = userClient.update(updateUserReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 删除个人用户
     *
     * **接口说明：**删除个人用户。删除后再次使用相同的clientUserId添加个人用户时，可能返回新的openUserId。
     *
     * **适用场景：**用于个人用户在应用系统上不再需要使用法大大电子签服务的场景。
     */
    public static void userDelete() throws ApiException{
        DeleteUserReq deleteUserReq = new DeleteUserReq();
        deleteUserReq.setAccessToken(accessToken);
        //法大大平台为该用户在该应用appId范围内分配的唯一标识。
        deleteUserReq.setOpenUserId(openUserId);
        BaseRes<Void> res = userClient.delete(deleteUserReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 禁用个人用户
     *
     * **接口说明：**将已添加的用户暂时禁用。禁用后，该用户暂时不能通过该应用系统使用法大大平台服务。
     *
     * **适用场景：**用于需要暂时对个人用户停止服务，却不希望删除的场景。禁用后还可以激活。根据您的公司和法大大签署的订阅协议，如果法大大平台限制了您的应用系统的用户数量，禁用的用户将不占用该限制的名额。
     */
    public static void userDisable() throws ApiException{
        DisableUserReq disableUserReq = new DisableUserReq();
        disableUserReq.setAccessToken(accessToken);
        //法大大平台为该用户在该应用appId范围内分配的唯一标识。
        disableUserReq.setOpenUserId(openUserId);
        BaseRes<Void> res = userClient.disable(disableUserReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 恢复个人用户
     *
     * **接口说明：**将已禁用的用户再次激活。激活后，该用户可继续通过该应用系统使用法大大平台服务。
     *
     * **适用场景：**恢复对已禁用的用户的服务。
     *
     */
    public static void userEnable() throws ApiException{
        EnableUserReq enableUserReq = new EnableUserReq();
        enableUserReq.setAccessToken(accessToken);
        //法大大平台为该用户在该应用appId范围内分配的唯一标识。
        enableUserReq.setOpenUserId(openUserId);
        BaseRes<Void> res = userClient.enable(enableUserReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }


    /**
     * 获取个人用户授权链接
     *
     * **接口说明：** 应用系统向法大大平台获取一个页面链接，用于提醒用户进行授权操作，以授权应用系统访问用户在法大大平台的某些数据资源和操作权限。在用户操作授权前，法大大平台要求用户必须先完成登录和实名认证 (即: Authorization的前提是必须先完成Authentication)。
     *
     * **适用场景：**添加个人用户后，在该用户使用法大大电子签服务前，应用系统可根据自身业务流程设计，先提醒该用户进行授权。应用系统必须得到用户授权方可访问该用户的数据信息(如个人身份信息)和有权进行某些操作(如发起签署任务)。若用户只需被动参与签署任务的填写或签署，因为相关操作是用户自身操作的行为，则无需授权。
     *
     * **注意：** **用户授权**是非常重要的环节，它保障您的业务系统符合《中华人民共和国个人信息保护法》及《网络数据安全管理条例》等相关法律法规的规定，请在设计时认真对待。如需要相关支持，可咨询法大大服务支持人员和法律专家。
     */
    public static void userGetAuthUrl() throws ApiException {
        GetUserAuthUrlReq getUserAuthUrlReq = new GetUserAuthUrlReq();
        getUserAuthUrlReq.setAccessToken(accessToken);
        //法大大平台为该用户在该应用appId范围内分配的唯一标识。
        getUserAuthUrlReq.setOpenUserId(openUserId);
        //个人身份信息。可以指定，也可以不指定。
        UserIdentInfo userIdentInfo = new UserIdentInfo();
        getUserAuthUrlReq.setUserIdentInfo(userIdentInfo);
        //个人补充信息。可以提供，也可以不提供。
        UserInfoExtend userInfoExtend = new UserInfoExtend();
        getUserAuthUrlReq.setUserInfoExtend(userInfoExtend);
        //是否指定个人身份信息强制一致：false: 不强制一致，不必检查一致性，新认证时可修改；
        //true: 强制一致，需检查一致性，且新认证时不可修改。
        //缺省为false。
        getUserAuthUrlReq.setIdentInfoMatch(false);
        //用户授权范围列表：只有在授权范围内的权限，该应用系统才可调用
        //ident_info: 身份信息 (涉及个人隐私数据，需得到用户授权)
        //signtask_init: 发起签署任务 (在合同签署任务中，发起方地位特殊，需得到用户授权)
        //resource_for_sign: 签署相关数据资源 (如文档和模板等，是属于用户的，需得到用户授权)
        //默认为空。
        String[] requestAuthScopes = {AuthScopeEnum.IDENT_INFO.getCode(),AuthScopeEnum.SIGNTASK_INIT.getCode(),AuthScopeEnum.RESOURCE_FOR_SIGN.getCode()};
        getUserAuthUrlReq.setRequestAuthScope(Arrays.asList(requestAuthScopes));

        //重定向地址。即用户在返回的页面上完成操作后重定向跳转到该地址，并且附带上参数。该地址是应用系统的地址，以实现用户交互在应用系统和法大大平台之间的连贯性。长度最大500个字符。
        //注意：如果未设置redirectUrl，则授权完成的参数通过回调事件通知应用系统服务端。
        getUserAuthUrlReq.setRedirectUrl("https://www.fadada.com");

        BaseRes<EUrlRes> res = userClient.getAuthUrl(getUserAuthUrlReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 查询个人用户基本信息
     *
     * **接口说明：**获取个人用户的基本信息、认证状态、授权状态和范围等。注意：该接口返回的信息中不涉及个人隐私，因此不需要授权。
     *
     * **适用场景：**应用系统需管理帐号对应关系、校验用户信息一致性、查询实名认证状态和授权信息时使用。
     */
    public static void userGet() throws ApiException{
        GetUserReq getUserReq = new GetUserReq();
        getUserReq.setAccessToken(accessToken);
        //法大大平台为该用户在该应用appId范围内分配的唯一标识。
        getUserReq.setOpenUserId(openUserId);
        BaseRes<UserRes> res = userClient.get(getUserReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }

    /**
     * 获取用户实名信息
     *
     * **接口说明：**用于获取个人用户的身份信息。
     *
     * **适用场景：**应用系统需要对用户在法大大平台上的实名身份信息进行比对或数据展示来进一步确认其身份。
     *
     * **注意：**个人用户实名信息受《中华人民共和国个人信息保护法》及《网络数据安全管理条例》等相关法律法规保护，只有经过用户授权后，应用系统方可获得此信息。不能被随意调用并要严格、细致限制使用范围。
     *
     * **授权要求：**应用系统需提前获得的用户授权才可调用该接口。收到该接口调用后，法大大平台将检查授权信息和授权范围，如果该用户未授权，则将返回失败。参考[获取个人用户授权链接](#获取个人用户授权链接)。
     */
    public static void getIdentityInfo() throws ApiException {
        GetUserIdentityInfoReq getUserIdentityInfoReq = new GetUserIdentityInfoReq();
        getUserIdentityInfoReq.setAccessToken(accessToken);
        getUserIdentityInfoReq.setOpenUserId(openUserId);
        BaseRes<UserIdentityInfoRes> res = userClient.getIdentityInfo(getUserIdentityInfoReq);
        ResultUtil.printLog(res, openApiClient.getJsonStrategy());
    }


}
